package thread;

/**
 * JMM的研究 4组8操作成对
 */
//volatile
class volatileDemo {

    volatile int number = 0; // 可竞态并发

    /**
     * 单线程下的 可视化问题
     * <p>
     * 本线程NO2后无限NO1,不执行NO3同步 ->volatile矫正
     */
    public void run() throws InterruptedException {
        //volatile int number = 0;
        // 写这里相当于方法独有(即线程独有) volatile毫无意义 ; 且不满足new Thread(){}局部作用域number要求
        //final int number = 0;
        // 写final编译器会优化一个局部值给 new Thread(){}局部作用域可以满足要求 ; 但是这样无竞态并发
        new Thread(() -> {
            while (number == 0) {
                // 此处有点意思的 如果number没添加volatile,本线程无限使用工作内存内容 主动同步主存到内存的操作不会执行、
                // 只会在no2后的no1操作 但是不会执行no3操作
            }
            System.out.println("离开while刑满释放了");
        }).start();

        Thread.sleep(100);

        number = 1;
    }
    /**
     * 单线程下的 指令重排问题-复刻
     */

    /**
     * 基于run()run()1-> 原子化问题
     * <p>
     * run()内解决指令顺序->单个线程内操作的有序性(NO2->NO1->NO3)
     * 但线程间切换(CPU时间片)导致单线程内操作(while(){i++})无法做到串行(NO2->NO1->NO3,会被切走无法原子化)
     * > 1加锁 2Atomic
     */
    public void run2() {

    }

    /**
     * 研究一下 unsafe (CAS与ABA)
     */

    public static void main(String[] args) throws InterruptedException {
        new volatileDemo().run();
    }


}